package com.ly.controller;


import cn.hutool.core.bean.BeanUtil;
import com.ly.dto.LoginFormDTO;
import com.ly.dto.Result;
import com.ly.dto.UserDTO;
import com.ly.entity.User;
import com.ly.entity.UserInfo;
import com.ly.service.IUserInfoService;
import com.ly.service.IUserService;
import com.ly.utils.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @Resource
    private IUserInfoService userInfoService;

    /**
     * 发送手机验证码
     * session: 在java web中session是一个存储在WEB服务器端的java对象，该对象代表用户和WEB服务器的一次会话。
     *          一般多数情况下，用户打开浏览器，在浏览器上进行一些操作，然后将浏览器关闭，表示一次会话结束。
     *          Cookie可以将会话状态保存在浏览器客户端，HttpSession可以将会话状态保存在WEB服务器端。
     * session的工作原理：
             *  1. 打开浏览器，在浏览器上发送首次请求
             *  2. 服务器会创建一个HttpSession对象，该对象代表一次会话
             *  3. 同时生成HttpSession对象对应的Cookie对象，并且Cookie对象的name是jsessionid，Cookie的value是32位长度的字符串（jsessionid=xxxx）
             *  4. 服务器将Cookie的value和HttpSession对象绑定到session列表中
             *  5. 服务器将Cookie完整发送给浏览器客户端
             *  6. 浏览器客户端将Cookie保存到缓存中
             *  7. 只要浏览器不关闭，Cookie就不会消失
             *  8. 当再次发送请求的时候，会自动提交缓存中当的Cookie
             *  9. 服务器接收到Cookie，验证该Cookie的name是否是jsessionid，然后获取该Cookie的value
             *  10. 通过Cookie的value去session列表中检索对应的HttpSession对象
     */
    @PostMapping("code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        return userService.sendCode(phone,session);
    }

    /**
     * 登录功能
     * @param loginForm 登录参数，包含手机号、验证码；或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
        Result result = userService.login(loginForm, session);
        return result;  // Result.ok(token)
    }

    /**
     * 登出功能
     * @return 无
     */
    @PostMapping("/logout")
    public Result logout(){
        // TODO 实现登出功能
        return Result.fail("功能未完成");
    }

    @GetMapping("/me")
    public Result me(){
        // 获取当前登录的用户并返回
        UserDTO user = UserHolder.getUser();
        return Result.ok(user);
    }

    @GetMapping("/info/{id}")
    public Result info(@PathVariable("id") Long userId){
        // 查询详情
        UserInfo info = userInfoService.getById(userId);
        if (info == null) {
            // 没有详情，应该是第一次查看详情
            return Result.ok();
        }
        info.setCreateTime(null);
        info.setUpdateTime(null);
        // 返回
        return Result.ok(info);
    }

    @GetMapping("/{id}")
    public Result queryUserById(@PathVariable("id") Long userId){
        // 查询详情
        User user = userService.getById(userId);
        if (user == null) {
            return Result.ok();
        }
        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        // 返回
        return Result.ok(userDTO);
    }

    /**
     * 用户签到功能
     *  用redis的BitMap（底层基于String结构）实现：
     *  key为 用户+年月
     *  value中每一个bit位代表某一天的签到情况（0或1）
     */
    @PostMapping("/sign")
    public Result sign(){
        return userService.sign();
    }


    /**
     * 用户在本月的连续签到天数
     */
    @GetMapping("/sign/count")
    public Result signCount(){
        return userService.signCount();
    }


}
